﻿using LibQuestionIs.Enums;
using LibQuestionIs.Extensions;
using LibQuestionIs.Models;
using System;
using System.Linq;
using System.Threading.Tasks;
using Windows.Data.Xml.Dom;
using Windows.Storage;

namespace LibQuestionIs.Managers
{
    public class ManagerRoamingState
    {
        #region Attributi XML


        private static XmlDocument dom;
        private static XmlElement x;
        private const string NOMEXML = "QuizApp.xml";
        private const string ElementName = "Punteggi";

        static StorageFile file;

        public StorageFolder storageFolder;
        /// <summary>
        /// Metodo che permette di Creare/Aprire il file XML
        /// </summary>
        /// <returns></returns>
        private async Task CreateXmlDocument()
        {
            dom = new XmlDocument();
            storageFolder = ApplicationData.Current.RoamingFolder;
            file = await FileExtensions.TryGetFileAsync(storageFolder, NOMEXML);
            if (file == null)
            {
                file = await storageFolder.CreateFileAsync(NOMEXML, CreationCollisionOption.OpenIfExists);
                x = dom.CreateElement(ElementName);
                dom.AppendChild(x);
                await dom.SaveToFileAsync(file);
            }
            else
            {
                dom.LoadXml(await FileIO.ReadTextAsync(file));
                x = dom.DocumentElement;
            }
        }

        /// <summary>
        /// Metodo di inserimento Punteggi
        /// </summary>
        public async void WritePunteggiXml(PunteggiXML punteggio)
        {
            await CreateXmlDocument();
            bool trovato = false;

            var nodi = x.ChildNodes.Where(z => z.GetType() == (typeof(XmlElement)));
            for (int i = nodi.Count() - 1; i >= 0; i--)
            {
                IXmlNode ElementoDaCancellare = nodi.ElementAt(i);
                XmlElement item = (XmlElement)nodi.ElementAt(i);
                PunteggiXML valoreDaXML = new PunteggiXML();
                foreach (XmlAttribute item2 in item.Attributes)
                {
                    TypePunteggiXMLAttribute typeAttribute = (TypePunteggiXMLAttribute)Enum.Parse(typeof(TypePunteggiXMLAttribute), item2.NodeName);
                    switch (typeAttribute)
                    {
                        case TypePunteggiXMLAttribute.TIPOLOGIATEST:
                            valoreDaXML.TipologiaTest = item2.NodeValue.ToString();
                            break;
                        case TypePunteggiXMLAttribute.VALORE:
                            valoreDaXML.Punteggio = item2.NodeValue.ToString();
                            break;
                        case TypePunteggiXMLAttribute.SECONDIRIMANENTI:
                            valoreDaXML.SecondiRimanenti = item2.NodeValue.ToString();
                            break;
                        case TypePunteggiXMLAttribute.MOLTIPLICATORE:
                            valoreDaXML.Moltiplicatore = item2.NodeValue.ToString();
                            break;
                        default:
                            break;
                    }
                }
                if (valoreDaXML.TipologiaTest == punteggio.TipologiaTest)
                {
                    trovato = true;
                    if (Convert.ToInt32(valoreDaXML.Punteggio) < Convert.ToInt32(punteggio.Punteggio))
                    {
                        x.RemoveChild(ElementoDaCancellare);
                        await InsertPunteggioXML(punteggio);
                    }
                    else
                        break;
                }
            }
            if (!trovato)
                await InsertPunteggioXML(punteggio);
            ManagerTiles.AggiuntaTile(punteggio);
        }

        private static async Task InsertPunteggioXML(PunteggiXML punteggio)
        {
            XmlElement ElementPunteggio = dom.CreateElement("PUNTEGGIO");
            ElementPunteggio.SetAttribute("TIPOLOGIATEST", punteggio.TipologiaTest);
            ElementPunteggio.SetAttribute("VALORE", punteggio.Punteggio);
            ElementPunteggio.SetAttribute("SECONDIRIMANENTI", punteggio.SecondiRimanenti);
            ElementPunteggio.SetAttribute("MOLTIPLICATORE", punteggio.Moltiplicatore);
            x.AppendChild(ElementPunteggio);
            await dom.SaveToFileAsync(file);
        }

        #endregion
        


        public const string filename = "version.txt";

        public async Task Scrivi(string versione)
        {
            storageFolder = ApplicationData.Current.RoamingFolder;
            StorageFile file = await storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            await FileIO.WriteTextAsync(file, versione.ToString());
        }

        public async Task<String> Leggi()
        {
            try
            {
                storageFolder = ApplicationData.Current.RoamingFolder;
                StorageFile file = await storageFolder.GetFileAsync(filename);
                return await FileIO.ReadTextAsync(file);
            }
            catch (Exception ex)
            {
                return "1";
            }
        }
    }
}
